\documentclass[11pt,a4paper,draft]{report}%mwart
\usepackage[utf8]{inputenc}
\usepackage{polski}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{latexsym}
\usepackage{indentfirst}
\usepackage{hyperref}
\usepackage[dvipdfm,colorlinks=true]{hyperref}    

\title{PROFESSORS SERVICE - licencjacki projekt programistyczny}
\author{Robert Zaremba i Filip Mróz}

\addtolength{\hoffset}{-1.0cm}
\addtolength{\textwidth}{2cm}

\addtolength{\voffset}{-1.0cm}
\addtolength{\textheight}{2.0cm}
\sloppy

\begin{document}
\maketitle
\date
\tableofcontents

\chapter{Prezentacja programu}
	W tej części opisany zostanie problem jaki został napotkany przez zleceniodawce, zaproponowane przez nas rozwiązanie oraz krótko opisana zostanie funkcjonalność aplikacji z wyszczególnieniem w jaki sposób rozwiązuje ona niedogodności poprzedniego systemu.
	\section{Prezentacja problemu}
		Zleceniodawcą jest Dziekanat Instytutu Fizyki i Astronomii Uniwersytetu Wrocławskiego. Pierwszy kontakt z nim odbył się 3.04.2009. W następnym tygodniu, 10.04.2009 dostaliśmy propozycję projektu, który polegał na stworzeniu systemu do administracji pracownikami naukowymi. Aktualny system zbierania danych pracowników był bardzo prymitywny. Miał on postać prostej bazy w MS Access. W podobny sposób były także gromadzone dane o publikacjach pracowników Instytutu. Nie było żadnego systemu, który łączył by te dane, oraz wnioski o granty dla pracowników. Dużą niedogodnością był także fakt, że pracownicy nie mieli bezpośredniego wglądu do tych danych, a także każda zmiana danych personalnych wymagała kontaktu z dziekanatem. Potrzebny był, więc system trzymający te dane w takiej postaci, by osoby uprawnione mogły je przeglądać i modyfikować.
	\section{Prezentacja rozwiązania}
		Prezentowane przez nas rozwiązanie ma postać aplikacji webowej umieszczonej na serwerze Instytutu Fizyki i Astronomii. Jest ona napisana w Pythonowym frameworku web2py. Poniżej opisane zostaną podstawowe informacje o programie.
		\subsection{Możliwości programu}
			Po zalogowaniu możliwe działania oraz ilość udostępnionych do podglądu danych zależy od posiadanych uprawnień. Istnieją trzy role: pracownik, moderator instytutowy oraz administrator. Administrator ma podobne prawa co moderator, ale ma też dostęp do interfejsu pozwalającego za całkowitą modyfikację systemu. Funkcjonalność aplikacji można podzielić na trzy główne części. Podział ten odzwierciedla rodzaje danych trzymanych w bazie oraz kolejne otrzymywane przez nas specyfikacje.
			\subsubsection{Warstwa pracowników}
				Każdy pracownik ma przyporządkowanego sobie użytkownika pozwalającego na zalogowanie się. Dane pracowników mogą być przeglądane przez innych pracowników (w ograniczonym stopniu) oraz modyfikowane (również w ograniczonym stopniu) przez niego. Moderator może dodawać pracowników, a także modyfikować i przeglądać wszystkie dane pracowników. Dodatkowo dla każdego pracownika wyświetlana jest lista jego publikacji oraz przyznanych mu grantów.
			\subsubsection{Warstwa publikacji}
				Skupia się na publikacjach pracowników w liczących się czasopismach. Pozwala na trzymanie i edytowanie danych o publikacjach, a także w znaczny sposób pomaga w ich dodawaniu, poprzez pobieranie danych o czasopismach i ich punktacji z Ministerstwa, podpowiadanie nazwy czasopisma i automatyczne uzupełnianie informacji o czasopiśmie.
			\subsubsection{Warstwa grantów}
				Zajmuje się trzymaniem informacji o przyznanych grantach. Moderator i administrator mają uprawnienia pozwalające na dodawanie oraz edycje już przyznanych grantów. 
		\subsection{Zaspokojenie zapotrzebowania}
			Aplikacje zaspokaja następujące braki poprzedniego systemu:
			\begin{itemize}
				\item{Dostęp dla pracowników - aplikacja webowa na serwerze Instytutu}
				\item{Prosta modyfikacja danych - użytkownik może modyfikować dane do których ma prawa}
				\item{Szybki wgląd w publikacje pracownika - wszystko znajduje się w danych pracownika}
			\end{itemize}
			Dodatkowo jako, że dane trzymane są teraz w przyjaznym formacie łatwo będzie dodawać kolejne usprawnienia w systemie.
	\section{Dalsze propozycje rozwojowe}
		Możliwości rozwoju programu są duże, ponieważ jego struktura jest dobrze zorganizowana i umożliwia praktycznie dowolne rozszerzenia. Usprawnienia, które aktualnie wydają się najważniejsze to:
		\begin{itemize}
			\item{System składania i rozpatrywania podań o granty}
			\item{Wspomaganie decyzji przyznawania grantów poprzez analizę publikacji wnioskujących o grant}
			\item{Wyszukiwarka informacji w danych o pracownikach, publikacjach czy grantach}
			\item{Bramka SQL pozwalająca na wykonywanie selectów i wyświetlanie wynikowej tabeli (dla moderatorów)}
		\end{itemize}
		
\chapter{Instrukcja obsługi programu}
	Instrukcja użytkowania podzielona została na trzy części w zależności od tego jakie uprawnienia ma użytkownik. Oczywiście każdy użytkownik, bez względu na rolę, ma możliwość zmiany hasła. Część związana z rzeczywistą reprezentacją danych oraz strukturą aplikacji znajduje się w ostatnim podrozdziale.
	\section{Pracownik}
		Uprawnienia na poziomie pracownika pozwalają na modyfikacje swoich danych osobowych oraz przeglądanie publikacji i grantów.
		\paragraph{Pracownicy:}\
		
			W tej sekcji można przejrzeć i zmodyfikować niektóre swoje dane ('Moje dane'), a także przejrzeć listę pracowników instytutu ('Lista'). Podczas przeglądania innych pracowników pokazywane są tylko ogólnodostępne informacje. Pod danymi każdego pracownika widać listę jego publikacji oraz przyznanych mu grantów.
		\paragraph{Publikacje:}\
		
			Można jedynie wyświetlić listę publikacji ('Lista') oraz przeglądać ich dane.
		\paragraph{Granty:}\
		
			Można jedynie wyświetlić listę przyznanych grantów ('Lista') oraz przeglądać ich dane.
	\section{Moderator}
		Moderator może to samo co pracownik, ale ma także możliwość dodawania, modyfikacji i usuwania większości rekordów w bazie.
		\paragraph{Pracownicy:}\ 
		
			Posiada możliwość edycji własnych danych ('Moje dane'), a także przeglądania, modyfikowania wszystkich danych (poza rolą) pracowników oraz ich usuwania ('Lista'). Dodawanie nowych pracowników ('Dodaj') odbywa się poprzez specjalny formularz. Moderator może dodawać tylko pracowników z rola pracownika. Przy dodawaniu lub usuwaniu pracownika automatycznie dodawany lub usuwany jest użytkownik z nim związany, a na podany adres email pracownika wysyłana jest wiadomość z domyślnym hasłem. Moderator ma także możliwość przejścia z formularza przeglądania do modyfikacji poprzez link 'modyfikuj' pod danymi pracownika.
		\paragraph{Publikacje:}  \ 
		
			Ważną operacją dostępną w tej sekcji jest uaktualnianie listy czasopism ('Uaktualnij...'). Po dodaniu pliku czasopism aplikacja spróbuje sama rozdzielić czasopisma na trzy podstawowe rodzaje. Jeśli jej się to nie uda to należy ręcznie zdecydować do jakiej kategorii należy dane czasopismo. 
			
			Sekcja pozwala także na edycję i usuwanie wzmianek o publikacjach. Dodawanie publikacji jest wspomagane poprzez podpowiadanie nazwy czasopisma, na podstawie już częściowo wypełnionego pola 'Nazwa czasopisma' i uzupełnienie pól punkty i rodzaj czasopisma na podstawie wybranego czasopisma (biorąc pod uwagę aktualny stan bazy czasopism). Ponieważ status czasopism może się w czasie zmieniać edycja nie korzysta już w tego ułatwienia i pozwala dowolnie zmieniać rodzaj czasopisma i liczbę punktów za publikacje. Edycja instytutowych autorów publikacji następuje na pomocą dwóch list rozwijanych: górna odpowiada za dodawanie autorów, dolna za usuwanie wcześniej dodanych.
		\paragraph{Granty:}\
		
			Możliwe jest dodawanie i modyfikowanie informacji o przyznanych grantach. Sposób edycja listy uczestników grantu jest analogiczna jak w przypadku listy autorów publikacji.
	\section{Administrator}
		Administrator jest użytkownikiem z pełnymi uprawnieniami. Poprzez interfejs admina może dokonać dowolnych zmian w systemie.
		\paragraph{Pracownicy:}\
		
			Może dodawać pracowników z uprawnieniami moderatora albo administratora.
		\paragraph{Interfejs admina:}\
		
			Daje dostęp (po podaniu dodatkowego hasła) do interfejsu web2py dającego całkowitą kontrolę nad aplikacją. Można poprzez niego modyfikować bazę danych oraz dowolne pliki wchodzące w skład aplikacji.
		\paragraph{Resetuj, inicjalizuj:}\
		
			Daje możliwość całkowitego zresetowania bazy danych (usunięcia wszystkich danych) i inicjalizacji stałych danych (m.in. rodzajów czasopism).
	\section{Zarys aplikacji}
		Tutaj znajduje się opis bazy danych oraz zarys struktury plików programu.
		\subsection{Baza danych}
			Tutaj znajduje się opis bazy danych oraz powiązań między tabelami. \\
			
			\begin{tabular}{|l|l|} \hline
				\multicolumn{2}{|l|}{\large{\textbf{pracownicy}}} \\ \hline
				{\bf imie}, string, notnull & {\bf nazwisko}, string, notnull\\ \hline
				{\bf plec}, integer & {\bf id\_tyt\_nauk}, {\bf tyt\_nauk}\\ \hline
				{\bf pesel}, string, notnull, unique & {\bf nip}, integer, notnull\\ \hline
				{\bf imie\_ojca}, string, notnull & {\bf imie\_matki}, string, notnull\\ \hline
				{\bf data\_ur}, date, notnull & {\bf miejsce\_ur}, string, notnull\\ \hline
				{\bf miejscowosc}, string, notnull & {\bf kod\_pocztowy}, string, notnull\\ \hline
				{\bf ulica}, string, notnull & {\bf nr\_domu}, string\\ \hline
				{\bf nr\_mieszkania}, string & {\bf kraj}, string, notnull\\ \hline
				{\bf email}, string & {\bf id\_czas\_pracy}, {\bf czas\_pracy}\\ \hline
				{\bf id\_form\_zatr}, {\bf form\_zatr} & {\bf id\_instytut}, {\bf instytut}\\ \hline
				{\bf id\_zaklad}, {\bf zaklad} & {\bf id\_dyscyplina}, {\bf dyscyplina}\\ \hline
				{\bf specjalnosc}, string&\\ \hline
			\end{tabular}\\

			{\bf Dodatkowo:} nr\_domu lub nr\_mieszkania musi być wypełnione, pole email jest używane do logowania. Pole plec jest równe 0 dla kobiety i 1 dla mężczyzny.
			\\ \\
			 

			\begin{tabular}{|l|l|} \hline
				\multicolumn{2}{|l|}{\large{\textbf{granty}}} \\ \hline
				{\bf kierownik}, {\bf pracownicy}, notnull & {\bf nr\_decyzji}, string, notnull, unique\\ \hline
				{\bf rodzaj}, rodzaje\_grantow, notnull & {\bf temat}, string, notnull\\ \hline
				{\bf kwota}, double, notnull & {\bf rok\_przyznania}, integer, notnull\\ \hline
				{\bf rok\_zakonczenia}, integer, notnull&\\ \hline
			\end{tabular}\\ \\
			 

			\begin{tabular}{|l|l|} \hline
				\multicolumn{2}{|l|}{\large{\textbf{uzytkownicy}}} \\ \hline
				{\bf password}, password & {\bf registration\_key}, string\\ \hline
				{\bf id\_rola}, rola & {\bf id\_pracownik}, {\bf pracownicy}, unique\\ \hline
			\end{tabular}\\

			{\bf Dodatkowo:} Trzymany jest hash hasła.
			\\ \\
			 

			\begin{tabular}{|l|l|} \hline
				\multicolumn{2}{|l|}{\large{\textbf{granty\_pracownicy}}} \\ \hline
				{\bf id\_grant}, {\bf granty}, notnull & {\bf id\_pracownik}, {\bf pracownicy}, notnull\\ \hline
			\end{tabular}\\

			{\bf Dodatkowo:} Łączy uczestników granty z grantem.
			\\ \\
			 

			\begin{tabular}{|l|l|} \hline
				\multicolumn{2}{|l|}{\large{\textbf{czasopisma}}} \\ \hline
				{\bf nazwa}, string, notnull, unique & {\bf id\_rodzaj}, {\bf rodzaj\_czasopisma}, notnull\\ \hline
				{\bf punkty}, integer, notnull&\\ \hline
			\end{tabular}\\ \\
			 

			\begin{tabular}{|l|} \hline
				\large{\textbf{publikacje}}\\ \hline
				{\bf tytul}, string, notnull \\ \hline {\bf autorzy}, string, notnull\\ \hline
				{\bf nazwa\_czasopisma}, string, notnull \\ \hline {\bf id\_rodzaj\_czasopisma}, {\bf rodzaj\_czasopisma}, notnull\\ \hline
				{\bf monografia}, boolean \\ \hline {\bf nr}, integer\\ \hline
				{\bf rok}, integer, notnull \\ \hline {\bf strony\_od}, integer, notnull\\ \hline
				{\bf strony\_do}, integer, notnull \\ \hline {\bf punkty}, integer, notnull\\ \hline
			\end{tabular}\\

			{\bf Dodatkowo:} Lista autorów ma mieć postać listy osób poprzedzielanych przecinkiem, gdzie każda osoba jest zapisana jako 'I. Nazwisko'. \\
						
						
			Baza danych zawiera jeszcze kilkanaście małych tabel służących do trzymania danych o małych dziedzinach (na przykład listę tytułów naukowych), wszystkie one mają jedno pole nazwa, które jest jednocześnie kluczem. Rekordy do nich są dodawane tylko podczas inicjalizacji bazy danych. Te tabele to: 
				
				\begin{tabular}{p{0.47\linewidth}p{0.4\linewidth}}
					\begin{itemize}
						\item{rola}
						\item{tyt\_nauk}
						\item{form\_zatr}
						\item{instytut}
						\item{dyscyplina}
					\end{itemize} &
					\begin{itemize}
						\item{czas\_pracy}
						\item{zaklad}
						\item{rodzaj\_czasopisma}
						\item{rodzaje\_grantow}
					\end{itemize}\\
				\end{tabular}

		\subsection{Struktura plików}
			Struktura katalogów i podział plików jest zgodny z rozwiązaniem idei MVC w web2py. Pliki z Controllers odpowiadają na zapytania przeglądarki i na podstawie bazy danych z katalogu Databases zwracają wynik, który jest następnie wyświetlany za pomocą plików z Views. Każdy plik źródłowy jest dość dobrze skomentowany, więc poniżej będzie tylko krótka prezentacja najważniejszych plików.
			\begin{description}
				\item[Controllers] {\
					\begin{itemize}
						\item{pracownicy.py - steruje zapytaniami wykonującymi operacje na pracownikach}
						\item{publikacje.py - steruje zapytaniami wykonującymi operacje na publikacjach}
						\item{granty.py - steruje zapytaniami wykonującymi operacje na grantach}
					\end{itemize}
				}
				\item[Model] {\
					\begin{itemize}
						\item{01professorscrud.py - główny plik przetwarzający dane. Między innymi tworzy klasę ProfessorsSQLTABLE odpowiedzialny za wyświetlanie zapytań typu select, ProfessorsSQLFORM będący bazą wszystkich formularzy oraz zawiera wiele pomocniczych funkcji}
						\item{02pracownicy.py - definiuje tabele związane z pracownikami}
						\item{uzytkownicy.py - definiuje tabele rola i uzytkownicy}
						\item{granty.py - definiuje tabele związane z grantami}
						\item{publikacje.py - definiuje tabele związane z publikacjami}
						\item{zautdb.py - definiuje klasę odpowiedzialną za autoryzację użytkowników}
					\end{itemize}
				}
				
				\item[Modules] {\
					
					Znajdują się tu moduły odpowiedzialne za dodawanie stałych wartości do bazy danych.
				}
				\item[Views] {\
					\begin{itemize}
						\item{menu.html - odpowiada za menu z lewej strony ekranu}
						\item{szablon.html - podstawowy szablon aplikacji}
					\end{itemize}
				}
			\end{description}
			
		
		
		
		
		
		
		
\chapter{Instrukcje rozwoju i wdrożenia}
	\section{Developing}
	\subsection{Technologia}

		Aplikacja została zaprojektowana w języku programowania \textbf{\href{http://python.org}{Python}} za pomocą frameworka internetowego \textbf{\href{http://www.web2py.com}{web2py}}. Wybór padł na Pythona gdyż jest on szybkim, nowoczesnym skryptowym językiem programowania (w porównaniu do innych tego typu języków), dla którego istnieje dużo bibliotek. Dokumentacje do tych technologii są dostępne na stronach domowych. Można także łatwo znaleźć mnóstwo informacji w internecie.
		

		Plusy wyboru tej technologii (python + web2py):
	\begin{itemize}
			\item python 
			  \begin{itemize}
				\item język wieloplatformowy,
				\item szybki, skryptowy - nie trzeba rekompilować
				\item dostęp do wielu modułów, olbrzymia ilość bibliotek, w tym większość jest przenośnych
				\item łatwość pisania
				\item czytelna składnia
				\item API systemu operacyjnego
				\item łatwy do nauki
			  \end{itemize}
			\item web2py
			  \begin{itemize}
			   \item Opensourcowy framework napisany w Pythonie
				\item Stworzony do szybkiej produkcji aplikacji internetowych, bazodanowych
				\item jest podobny do Railsów, tyle że w Pythonie, więc solidniejszy i szybszy
				\item nie potrzeba żadnej instalacji i pakietów zależnych (poza Pythonem) - łatwość w transporcie
				\item zagwarantowana stabilność API od wersji 1.0 (aktualna 1.63)
				\item zapobiega wrogim "przeglądaniu słowników", natarciom SQL, i wielu innym znanym atakom poprzez wbudowane mechanizmy zapobiegawcze (jak np filtrowanie formularzy)
				\item automatyczne zarządzanie sesją, cookies (ciasteczkami) i błędami (tracker)
			  \end{itemize}
	\end{itemize}
		Minusy: \\
		Jak na razie żadnych.

	\subsection{Kontrola wersji i tracker}

	\paragraph{Kontrola wersji}  Do kontroli wersji użyliśmy systemu SVN zamieszczonego na code.google.com. Adres repozytorium: \\
	http://professorsservice.googlecode.com/svn/trunk/professorsservice
	\\
	
	\paragraph{System do zarządzania produkcją}  Jako oprogramowanie do wspomagania zarządzania produkcją utworzyliśmy\\
	http://code.google.com
	\\

	W całym systemie zawarte są pomocne narzędzia efektywnego tworzenia oprogramowania:
	\begin{itemize}
		\item narzędzia do podziału kodu, 
		\item podgląd wersji, 
		\item zobaczenia różnic między kolejnymi wersjami (w kodzie),
		\item system Wiki,
		\item obsługa zadań,
	\end{itemize}

	\subsection{Wdrożenie aplikacji}
		Aplikacja działa i została wdrożona do użytku na serwerze wfa.uni.wroc.pl.
		Serwer dostępny jest przez FTP. Dokładne informacje o administratorze serwera jak i koncie można zdobyć pośrednio przez dziekanat wydziału Fizyki i Astronomii UWr.

	\paragraph{Opis konfiguracji serwera lighttpd i mod\_fastcgi}
	
	\begin{enumerate}

	\item w pliku konfiguracyjnym lighttpd.conf dodajemy:


\$HTTP["host"] =~  "pracownicy.wfa.uni.wroc.pl" \{

	server.port = \textsl{port} \\
	server.username = \textsl{user} \\
	server.groupname = \textsl{group} \\
	server.modules += ('mod\_fastcgi')  \# w przypadku gdy domyślnie nie jest ładowany

	server.document-root = \textsl{/ścieżka/do/konta/}
	server.error-handler-404 = "/web2py.fcgi" \\
	server.errorlog = "/tmp/error.log"  \# lub inny plik, do którego wszyscy mogą zapisywać

	url.acces-deny += (".py")

	fastcgi.server = ( "/" =$>$  \\
		("localhost" =$>$ (       \\
			"bin-path"        =$>$ \textsl{"/ścieżka/do/konta/apracnauk/web2py.fcgi"},  \\
			"min-procs" =$>$ 1,    \\
			"socket" =$>$ "/tmp/web2py.sock" ,  \# lub inny plik do którego wszyscy mogą zapisywać                 \\
			"bin-environment" =$>$ (    \\
						"web2py\_path" =$>$ \textsl{"/ścieżka/do/konta/"},   \\
					)  
			) 
		) 
		) 

	url.rewrite-once = (
		"\^(/.*)\$" =$>$ "/web2py\$1",
	)

\}


	\item katalog jak i wszystkie pliki w katalogu mają mieć właściciela i grupę tak aby proces lighttpd mógł modyfikować i tworzyć nowe pliki.

   można zrobić to tak, niech: \\
  user= \textsl{nazwa użytkownika, który jest właścicielem konta pracowynicy.wfa.uni.wroc.pl}  \\
  grupa= \textsl{nazwa domyślnej grupy z pliku lighttpd.conf}  \\
  home = \textsl{katalog dla konta pracownicy.wfa.uni.wroc.pl}  \\

  1. dodać user do grupy \\
  2. zmienić właściciela home: chown -R user:grupa /ścieżka/do/home/ \\
  3. ustawić w powyższej konfiguracji \\
  	\hspace*{2cm}	server.username=user   \\
   \hspace*{2cm}   server.groupname=grupa  \\
 

\noindent
plik fcgihandler.py oraz jego dowiązanie symboliczne (web2py.fcgi) mają mieć prawa do uruchamiania \textit{chmod ug+x} dla u - właściciela konta, g - grupy lighttpd;

	\end{enumerate}

	\section{Opinia zleceniodawcy}
		Zleceniodawca wyraził pozytywną opinię. Aplikacja spełnia specyfikację i jest już obsługiwana przez odpowiednich ludzi. Szczegóły znajdują się w pliku \textsl{Opinia.doc}

		
	\section{Problemy}
	
	\paragraph{Podpięcie aplikacji pod serwer} 
	
	\indent \\ Z podpięciem aplikacji pod serwer było parę problemów. Trzeba było zrozumieć system działania serwera i frameworka, oraz różnych modów do serwera (\textsl{mod\_python, mod\_wsgi, mod\_fcg...}).     \\
		Nie mieliśmy pełnego dostępu do serwera co nastarczyło trudności w kontaktowaniu się z administratorem, który okazał się pomocy i chętny do wielu prób postawienia aplikacji na serwerze. \\
		Wynik wspólnych zmagań jest zawarty powyżej, w opisie konfiguracji serwera lighttpd.

	\paragraph{Pilnowanie harmonogramu}

	\indent \\  Jako studenci mieliśmy także wiele innych zajęć, co powodowało nawały pracy i długie godziny spędzone przed komputerem.

	\paragraph{Zaplanowanie interfejsu do aktualizacji czasopism}

	\indent \\ Jedną z części projektu jest widok do łatwej aktualizacji bazy czasopism. Baza ta jest dostępna na stornach ministerstwa nauki i szkolnictwa wyższego.
	Lista ta nie ma stałego adresu URL, jest generowana za każdym razem gdy pojawia się nowa wersja - tak że trudno było automatycznie sprawdzać nową wersję. Wybraliśmy opcję, aby to moderator, lub administrator aplikacji decydował kiedy pobrać nową wersję.
	W dodatku lista ta jest aktualnie dostępna w formacie .xls (Excel), choć czasami pojawia się w formacie .pdf. Z racji tego założyliśmy że to użytkownik skonwertuje plik do formatu .csv (uniwersalny format przechowywania danych w plikach tekstowych). Dokładny opis postępowania opisany jest w widoku - jest łatwy i intuicyjny.
	Wymaga od użytkownika pobrania bazy, konwersji do csv (dostępne w bezpłatnych programach np: OpenOffice, Gnumeric...), i wysłania pliku za pomocą prostego  formularza.

	\paragraph{Szukanie różnic implementacyjnych JavaScript na IE, Mozilla, Opera..}
		\indent \\  Podczas pisania aplikacji trafiliśmy na trudności z JavaScript, gdyż jest różnie interpretowana na różnych przeglądarkach. Trzeba się postarać, żeby napisać dobry kod poprawnie działający na różnych przeglądarkach.

	\paragraph{Klasyfikowanie czasopism jako czasopisma publikowane w Języku Polskim i czasopisma publikowane w języku obcym}

	\indent \\ Nasza baza z specyfikacji miała podział na 3 typy czasopism:
		\begin{enumerate}
			\item czasopisma wyróżnione w Journal Citation Reports (JCR)
			\item czasopisma punktowane przez ministerstwo, publikowane w Języku Polskim
			\item czasopisma punktowane przez ministerstwo, publikowane w języku obcym,
			\item pozostałe czasopisma
		\end{enumerate}
		Podczas gdy na liście ministerialnej, czasopisma z pozycji (2) i (3) były w jednej grupie. Łącznie wszystkich czasopism było parę tysięcy, więc trzeba było skonstruować automatyczne klasyfikowanie czasopism. 
		Zaimplementowaliśmy algorytm, korzystający z korpusa Języka Polskiego, który bada występowanie polskich słów w tytule i przydziela czasopisma do odpowiedniej grupy. Następnie użytkownik sprawdza czy klasyfikacja jest poprawna, i ewentualnie wprowadza zmiany.
		Tak przygotowana klasyfikacja jest zapisana na serwerze.
		Podczas następnej aktualizacji listy ministerialnej czasopism, program najpierw klasyfikuje czasopisma zgodnie z wcześniejszą klasyfikacją zapisaną na serwerze, następnie jeśli w nowej liście pojawiły się czasopisma, które nie pojawiły się w poprzedniej, użytkownik ma możliwość wyboru do której kategorii powinny należeć czasopisma, tak przygotowana klasyfikacja jest dołączana do poprzedniej i zapisywana na serwerze.

	\paragraph{Obsługa skryptów JavaScript aby działały w przeglądarkach IE, Firefox, Opera}
	\indent \\ 
	Jak powszechnie wiadomo, trudno napisać jest przenośny kod zarządzany przez przeglądarki internetowe. U nas także nie obyło się bez problemów.
	Jednak największą zmorą jest tutaj trud w szukaniu błędów  - gdyż przeglądarki nie mają dobrych debuggerów do kodu JavaScript. 
	Jednym z błędów, który był odrzucany w IE i którego znalezienie przysporzyło dość trochę trudności było zostawienie przecinka, po ostatnim elemencie listy (przy definiowaniu zawartości listy). Tj było $ lista = [l_1, l_2, l_3, ]$ a powinno być $ lista = [l_1, l_2, l_3]$
		
\chapter{Historia tworzenia aplikacji}
	\section{Kalendarium zmian}
		\begin{enumerate}
			\item[-] \textsl{10.04.2009} Kontakt z dziekanatem wydziału Fizyki i Astronomii. Dziekanat jest zainteresowany zleceniem projektu.
			\item[-] \textsl{16.04.2009} Ustalenie projektu. Rozmowa na temat celu i potrzeb dziekanatu.
			\item[-] \textsl{18.04.2009} Wstępny szkic - Aplikacja do zarządzania pracownikami naukowymi: baza danych pracowników i administrowanie działalnością naukową pracowników (statystyki publikacji pracownika, uczestnictwo w grantach). Dostęp do aplikacji powinien być zapewniony przez sieć wydziału. Podział projektu na części:
			\begin{itemize}
				\item jądro aplikacji i system użytkowników
				\item baza pracowników powiązana z użytkownikami (patrz opis bazy danych)
				\item moduł do administrowania publikacjami
				\item moduł do administrowania grantami
			\end{itemize}
			\item[-] \textsl{19.04.2009} Wybór technologii w której powstanie projekt - \textsl{web2py}. { \scshape Robert, Filip}
			\item[-] \textsl{20.04.2009} Założenie repozytorium kodu oraz tracera z systemem Wiki \url{http://code.google.com/p/professorsservice/} {\scshape Robert, Filip}.
			\item[-] \textsl{21.04.2009} Otrzymanie specyfikacji bazy pracowników. Stworzenie modelu pracownika na podstawie specyfikacji, postawienie jądra aplikacji v0.1 {\scshape Robert}.
			\item[-] \textsl{23.04.2009} Stworzenie szablonu strony HTML + CSS {\scshape Robert};
			\item[-] \textsl{25.04.2009} Rozwój jądra aplikacji v0.2 {\scshape Robert}.
			\item[-] \textsl{27.04.2009} Przygotowanie aplikacji pod serwer - \textsl{web2py} {\scshape Robert}.
			\item[-] \textsl{28.04.2009} Założenie systemu użytkowników v0.1  {\scshape Filip}.
			\item[-] \textsl{29.04.2009} Refaktoryzacja kodu, uporządkowanie danych na serwerze - założenie schematu, który będzie obowiązywał do końca tworzenia projektu (na serwer wrzucana tylko kompilowana aplikacja. Osobna ścieżka do źródeł rozwojowych) {\scshape Robert}.
			\item[-] \textsl{30.04.2009} Stworzenie modułu do wygodnego administrowania użytkownikami v0.2.{\scshape Filip }.
			\item[-] \textsl{5.05.2009} Poprawa systemu linków (od teraz są obsługiwane przez dekoratory html), Rozwój szablonu strony {\scshape Robert }.
			\item[-] \textsl{10.05.2009} Rozwój jądra systemu v0.2; wersja 0.3 systemu użytkowników. Współgranie jądra systemu z systemem użytkowników (integracja modułu z jądrem) {\scshape Filip }.
			\item[-] \textsl{11.05.2009} Drobne poprawki w kodzie, zmiana kodowania plików - teraz wszystkie w utf-8 {\scshape Robert }.
			\item[-] \textsl{13.05.2009} nowa wersja jądra v0.3; integracja modułu do tworzenia tabel i list html z szablonem strony i stylem CSS {\scshape Filip }.
			\item[-] \textsl{13.05.2009} obsługa crud {\scshape Filip }.
			\item[-] \textsl{15.05.2009} Otrzymanie drugiej części specyfikacji - publikacje naukowe {\scshape Robert }.
			\item[-] \textsl{15.05.2009} Dodanie obsługi komentarzy do pól formularzy do jądra systemu {\scshape Robert }
			\item[-] \textsl{16.05.2009} Stworzenie stron Wiki do uściślenia pracy nad projektem i jako forma wyjaśnienia problemów przy obsłudze kolejnych elementów projektu{\scshape Filip }.
			\item[-] \textsl{16.05.2009} Poprawienie wyglądu formularzy  {\scshape Filip }.
			\item[-] \textsl{17.05.2009} Obsługa dodawania, modyfikowania i przeglądania publikacji  {\scshape Filip }.
			\item[-] \textsl{17.05.2009} Poprawa wyglądu i sposobu przeglądania publikacji i pracowników w bazie  {\scshape Filip }.
			\item[-] \textsl{18.05.2009} Poprawa modelu publikacji, dodanie walidatorów do obsługi publikacji, dodanie relacji jeden (publikacja) do wielu (autor), automatyczne uzupełnianie tabeli o pola nie podane w formularzach (wnioskowane na podstawie pozostałych danych)  {\scshape Robert }.
			\item[-] \textsl{19.05.2009} Wersja v0.4 jądra systemu. Naprawa funkcji wyświetlających rekordy { \scshape Robert }.
			\item[-] \textsl{21.05.2009} Wersja v0.5 jądra systemu - automatyczne tworzenie obiektu dla danej tabeli z funkcjami uzupełniającymi pola i wyświetlającymi zawartość  {\scshape Filip }.
			\item[-] \textsl{21.05.2009} moduł od resetowania i inicjacji bazy danych dla całego systemu  {\scshape Robert }.
			\item[-] \textsl{21.05.2009}  Moduł dodający losowe rekordy do bazy danych  {\scshape Filip }.
			\item[-] \textsl{22.05.2009} Przeprogramowanie modułu użytkowników. Synchronizacja użytkownika z pracownikiem (relacja jeden do jeden  {\scshape Robert }.
			\item[-] \textsl{25.05.2009} obsługa Ajax do uzupełniania formularzy  {\scshape Filip }.
			\item[-] \textsl{25.05.2009} Moduł do aktualizacji listy czasopism (w których są publikowane artykuły pracowników naukowych)  {\scshape Robert }.
			\item[-] \textsl{26.05.2009} Naprawa błędów, podpowiadanie czasopism - Ajax  {\scshape Filip }.
			\item[-] \textsl{26.05.2009} Dodanie trzeciej części specyfikacji   {\scshape Robert }.
			\item[-] \textsl{26.05.2009} Model do trzeciej części specyfikacji  {\scshape Robert }.
			\item[-] \textsl{27.05.2009} system użytkowników v0.5 - sprecyzowanie autoryzacji (prawa do resetowania bazy, dodawania pracowników...)  {\scshape Filip }.
			\item[-] \textsl{29.05.2009} Poprawa wyglądu i działania podpowiadania nazwy czasopisma i zmiana funkcjonalności - teraz oparte JavaScript autocomplete   {\scshape Robert }.
			\item[-] \textsl{31.05.2009} Poprawa wyglądu strony. Styl do raportowania o błędach  {\scshape Robert }.
			\item[-] \textsl{31.05.2009} Poprawa działania jądra - wersja v0.55  {\scshape Filip }.
			\item[-] \textsl{2.06.2009} Rozwój jądra - v0.6, możliwość rozszerzania obiektu formularza o nowe pola wraz z walidatorami i zdarzeniami w wypadku wysłania  {\scshape Filip }.
			\item[-] \textsl{2.06.2009} Usunięcie administratora z listy pracowników, poprawa wyglądu listy pracowników  {\scshape Filip }.
			\item[-] \textsl{2.06.2009} Szkic struktury dokumentacji  {\scshape Filip }.
			\item[-] \textsl{3.06.2009} Naprawa błędu w funkcji autocomplete w IE  {\scshape Robert }.
			\item[-] \textsl{9.06.2009} Obsługa modyfikacji rekordów w relacji wielu do wielu  {\scshape Filip }.
			\item[-] \textsl{10.06.2009} Uzupełnienie dokumentacji  {\scshape Robert }.
			\item[-] \textsl{18.06.2009} Usunięcie testowych funkcji w aplikacji.  {\scshape Filip }.
			\item[-] \textsl{20.06.2009} Przygotowanie aplikacji do wersji produkcyjnej  {\scshape Robert }.

		\end{enumerate}


	\section{Kalendarium kontaktów ze zleceniodawcą}
		Listing kontaktów ze zleceniodawcą (np. czasy otrzymania kolejnych części)
		\begin{itemize}
			\item  \textsl{10.04.2009} Propozycja stworzenia projektu.
			\item  \textsl{16.04.2009} Ustalenie projektu, opis funkcjonalności i zastosowania.
			\item  \textsl{18.04.2009} Ustalenie projektu, opis funkcjonalności i zastosowania.
			\item  \textsl{22.04.2009} Konsultacje w sprawie pierwszej części specyfikacji (baza pracowników). Wymiana uwag.
			\item  \textsl{15.05.2009} Odebranie 2 części specyfikacji - publikacje naukowe.
			\item  \textsl{20.05.2009} Konsultacje w sprawie drugiej części specyfikacji.
			\item  \textsl{27.05.2009} Prezentacja postępów .
			\item  \textsl{3.06.2009} Konsultacje w sprawie 3 części specyfikacji .
			\item  \textsl{9.06.2009} Prezentacja działania aplikacji - obsługującej całość specyfikacji (wersja testowa) .
			\item  \textsl{22.05.2009} Oddanie działającej aplikacji. Wydanie opinii.

		\end{itemize}

\end{document}

